package gruppoSoluzione.mainService.services;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeSet;

import gruppoSoluzione.mainService.HTTPService;
import gruppoSoluzione.mainService.ServiceDB;
import gruppoSoluzione.mainService.ServiceDBLog;
import gruppoSoluzione.mainService.ServiceDate;
import gruppoSoluzione.mainService.ServiceParams;
import gruppoSoluzione.mainService.data.ListStringWriter;
import gruppoSoluzione.mainService.data.ServiceDBData;
import gruppoSoluzione.mainService.data.ServiceDBXML;

/**
 * Servizi che restituisce la sintesi di un insieme di stock
 * 
 * @author Alessandro Martinelli
 */
public class SintesiService implements HTTPService{

	@Override
	public ArrayList<String> getServiceResult(ServiceParams params) {
	
		String data = params.getValue("data");
		
		//Load server
		ServiceDBXML loader=new ServiceDBXML();
		ServiceDB db=new ServiceDB();
		loader.loadDB(db);
		
		ServiceDate serviceDate=new ServiceDate(data);
		Iterable<ServiceDBLog> logs=db.getLogsIterable(serviceDate);
		
		TreeSet<ServiceDBLog> filteredLogs = filterLogs(logs);
		
		HttpMessageWriter writer=new HttpMessageWriter(MimeHTTP.XML);
		ArrayList<String> risposta=writer.createHttpMessageHeader();
		
		try {
			ServiceDBData dataWriter=new ServiceDBData();
			dataWriter.writeStocks(new ListStringWriter(risposta), filteredLogs);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return risposta;
	}

	private TreeSet<ServiceDBLog> filterLogs(Iterable<ServiceDBLog> logs) {
		
		//non posso usare i 'set' qua, altrimenti riconosce i set 'uguali' e li rimpiazza
		ArrayList<ServiceDBLog> cleansedLogs=new ArrayList<ServiceDBLog>();
		ServiceDBLog sampleLog=new ServiceDBLog("", "", "");
		for (ServiceDBLog serviceDBLog : logs) {
			if(serviceDBLog.getLuogo().equals("Centrale")){
				cleansedLogs.add(sampleLog.generaLogSimile(serviceDBLog.getNumero(), serviceDBLog.getModello()));	
			}
		}
		Collections.sort(cleansedLogs);//lo tengo ordinato questo insieme, per garantire il funzionamento più sotto
		 
		TreeSet<ServiceDBLog> filteredLogs=new TreeSet<ServiceDBLog>();
		ServiceDBLog lastAddedLog=null;
		for (ServiceDBLog serviceDBLog : cleansedLogs) {
			if(lastAddedLog!=null && lastAddedLog.compareTo(serviceDBLog)==0){
				//add it's size to the last one instead of adding it to filteredLogs
				lastAddedLog.addSize(serviceDBLog);
			}else{
				//usiamo un clone per non andare a modificare (al passo sopra) l'istanza originale
				serviceDBLog=serviceDBLog.clone();
				filteredLogs.add(serviceDBLog);
				lastAddedLog=serviceDBLog;	
			}
		}
		return filteredLogs;
	}
	
}
